import pandas as pd
import json
import chardet
def _get_encoding(file_path):
    with open(file_path, 'rb') as f:
        result = chardet.detect(f.read())
        return result['encoding']
    

def get_data_overview(file_path):
    """
    读取 Excel 文件中的数据并存储到全局变量 DataFrame 中，同时返回文件的基本信息。

    参数:
        file_path (str): Excel 文件的路径。

    返回:
        dict: 包含 DataFrame 信息的字典，可以转换为 JSON 格式。
    """
    try:
        # 自动检测文件编码
        encoding = _get_encoding(file_path)
        print(f"Detected encoding: {encoding}")

        # 读取文件
        if file_path.endswith('.csv'):
            df = pd.read_csv(file_path, encoding=encoding)
        elif file_path.endswith(('.xlsx', '.xls', '.xlsm')):
            df = pd.read_excel(file_path, engine='openpyxl')
        else:
            print(f"不支持的文件格式：{file_path}")
            return None

        print("文件读取成功！")

        # 将 Int64Dtype 和 Float64Dtype 类型的列转换为 float 类型
        for col in df.columns:
            if pd.api.types.is_integer_dtype(df[col]) or pd.api.types.is_float_dtype(df[col]):
                df[col] = (df[col].astype(float).round(4))

        # 获取文件的基本信息
        #print(df.describe().to_dict())

        # 处理格式
        describe_df = df.describe()
        describe_df = describe_df.applymap(lambda x: x.isoformat() if isinstance(x, pd.Timestamp) else x)


        data_info = {
            "file_path": file_path,
            "df.shape": df.shape,
            #"columns": list(df.columns),
            "df.dtypes": {col: str(dtype) for col, dtype in df.dtypes.items()},  #"dtypes": dict(df.dtypes),直接用不行
            #"statistics": df.describe().to_dict(),
            #"head": df.head().to_dict(orient='records')[0],
            #"tail": df.tail().to_dict(),
            #"missing_values": df.isnull().sum().to_dict(), #缺失行数
            #"memory_usage": df.memory_usage().sum()
        }

        # 将字典转换为 JSON 格式
        json_info = json.dumps(data_info, indent=4, ensure_ascii=False)

        return json_info

    except FileNotFoundError:
        print(f"错误：文件 {file_path} 未找到，请检查路径是否正确。")
        return None
    except Exception as e:
        print(f"读取文件时发生错误：{e}")
        return None


# 示例用法
#file_path = "DataAgent/学生信息.xlsx"  
file_path = "DataAgent/结果1_全站按日期分组_2023全年.csv"
json_data = get_data_overview(file_path)

if json_data is not None:
    print(json_data)